const {
  ACCOUNT_OR_PASSWORD_IS_REQUIRED,
  ACCOUNT_IS_ALREADY_EXISTS,
} = require("../config/error-constants");
const userService = require("../service/user.service");
const md5password = require("../utils/md5-password");

/* 验证用户 */
const verifyUser = async (ctx, next) => {
  //1.获取用户传递过来信息
  const userInfo = ctx.request.body;

  //2.验证客户端传递过来的user是否可以保存到数据库中
  //   2.1 验证用户名和密码是否为空
  const { account, password } = userInfo;
  if (!account || !password) {
    // ctx.body = {
    //   code: -1001,
    //   message: "用户名或者密码不能为空~",
    // };
    // return;

    /* 
        拿到ctx中的app，然后发送出去一个事件，用于处理错误  
        传入错误常量，用于匹配错误的类型
        传入上下文ctx，用于调用body响应错误信息
    */
    return ctx.app.emit("error", ACCOUNT_OR_PASSWORD_IS_REQUIRED, ctx);
  }
  //   2.2 判断account信息是否在数据库中已经存在
  const users = await userService.findUserByACCOUNT(account);
  // console.log(users);
  if (users.length) {
    // ctx.body = {
    //   code: -1002,
    //   message: "该账号名被占用了，请重新注册~",
    // };
    // return;
    return ctx.app.emit("error", ACCOUNT_IS_ALREADY_EXISTS, ctx);
  }

  // 3.执行下一个中间件
  //   next函数有异步操作，这里应该加一个await
  await next();
};

/* 处理密码 */
const handlePassword = async (ctx, next) => {
  // 1.取出密码
  const { password } = ctx.request.body;

  // 2.对密码进行加密
  ctx.request.body.password = md5password(password);

  // 3.执行下一个中间件
  await next();
};

module.exports = {
  verifyUser,
  handlePassword,
};
